/**
 * 用户帮助类
 */
import Vue from 'vue';
import webDbHelper from "webDbHelper";

const userHelper = {
    /**
     * 用户信息可以
     * @type {String}
     */
    userInfoKey: 'userBaseInfo',

    /**
     * 退出登陆
     */
    loginOut() {
        webDbHelper.removeLItem(this.getUserInfoKey());
        webDbHelper.removeLItem(this.getUserInfoKey());
    },

    /**
     * 获取用户信息key
     * @returns {string}
     */
    getUserInfoKey() {
        // 重构后 type 与 did 固定，不再变更，不移除是为了不影响 redis 内已有数据
        // type 2 真实用户微信登录，did 1 部门 ID
        // return type + '_' + this.userInfoKey + '_' + did;
        return '2_' + this.userInfoKey + '_1';
    },

    /**
     * 获取用户信息
     * @param key
     * @returns {type|string|type[]|null}
     */
    getInfo(key) {
        let userInfo = webDbHelper.getLItem(this.getUserInfoKey());

        if (userInfo && key) {
            return userInfo[key] ? userInfo[key] : '';
        } else {
            return userInfo ? userInfo : null;
        }
    },

    /**
     * 登陆
     * @param  {Object=} params
     * @param  {string[]|null} params.info [附加登陆信息]
     * @param  {function|null} params.callback [登陆后回调方法，第一个返回值：true：登陆成功；false：登陆失败，第二个返回值：成功为用户信息，失败为错误原因]
     * @return {boolean}      [description]
     */
    login(params) {
        const userInfo = this.getInfo('');
        if (userInfo) {
            params.callback && params.callback(true, userInfo);

            return true;
        }

        console.log('login');
        if (Vue.prototype.commonHelper.clientType().isWeixin) {
            this.wxLogin(params);
        } else {
            params.callback && params.callback(false, '未知环境');
        }
    },

    /**
     * 微信登陆
     * @param params
     */
    wxLogin(params) {
        let code = Vue.prototype.commonHelper.query('code');
        let state = Vue.prototype.commonHelper.query('state');

        if (code) {
            this.wxLoginByCode(code, state, params);
        } else {
            this.wxGetAuthUrl(params);
        }
    },

    /**
     * 登陆微信通过code
     * @return {[type]} [description]
     */
    wxLoginByCode(code, state, params) {
        Vue.prototype.appFetch({
            url: 'getUserInfoByWxMpCode',
            method: 'get',
            data: {
                code,
                state
            }
        }, (res) => {
            if (res.code == 1) {
                let userInfo = this.makeUpUserInfo(res.result);

                webDbHelper.setLItem(this.getUserInfoKey(), userInfo, 7 * 86400 * 1000);
                params.callback && params.callback(true, userInfo);
            } else {
                console.log(res.msg);
                params.callback && params.callback(false, res.msg);
            }
        }, (error) => {
            console.log(error);
            params.callback && params.callback(false, '微信授权接口请求失败');
        });
    },

    /**
     * 微信获取授权登陆url
     * @return {[type]} [description]
     */
    wxGetAuthUrl(params) {
        let redirectUrl = Vue.prototype.commonHelper.reomveUrlParams(['appid', 'code', 'state']);

        Vue.prototype.appFetch({
            url: 'getWxAuthUrl',
            method: 'get',
            data: {
                redirectUrl: redirectUrl
            }
        }, (res) => {
            if (res.code == 1) {
                window.location.href = res.result.url;
            } else {
                console.log(res.msg);
                params.callback && params.callback(false, res.msg);
            }
        }, (error) => {
            console.log(error);
            params.callback && params.callback(false, '微信授权接口请求失败');
        });
    },

    /**
     * 补齐用户信息
     * @param  {string[]} userInfo
     * @returns {*}
     */
    makeUpUserInfo(userInfo) {
        let defaultHeadImg = appConfig.staticUrl + "img/avatar.png";

        for (let key in userInfo) {
            if (userInfo[key] === null) {
                userInfo[key] = '';
            }

            switch (key) {
                case 'headimgurl':
                    if (!userInfo[key]) {
                        userInfo[key] = defaultHeadImg;
                    }
            }
        }

        return userInfo;
    },
};

if (!Vue.prototype.userHelper) {
    Vue.prototype.userHelper = userHelper;
}

export default userHelper;
